home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 051-060 / amok52 / abitur / txt / abitur.mod next >
Text File  |  1993-11-04  |  9KB  |  324 lines

  1. MODULE Abitur;
  2.  
  3. FROM Fragen IMPORT Bewerte, SearchRNDFrage, FragePtr, SchuelerAntwort;
  4. FROM AbiturScreen IMPORT AddAbiTxtLin, ShowAbiTxt, weisS, blaU;
  5. FROM FaecherNamen IMPORT FaecherTypen, FaecherNamen;
  6. FROM InitialisiereSpieler IMPORT InitPlayers;
  7. FROM Aktionen IMPORT SpielAktion, GetAktion;
  8. (* FROM InOut IMPORT WriteString, WriteLn; *)
  9. FROM StundenPlan IMPORT ZeigePlan, ClosePlanFenster, Zeit, GetFach,
  10.                         Plaene, IncTime;
  11. FROM Zeugnis IMPORT ZeigSchuelerZeugnis;
  12. FROM Globals IMPORT SpielerPtr, AlleSpieler, AnzahlSpieler;
  13. FROM RealConversions IMPORT RealToStr;
  14. FROM IntuFrage IMPORT IntuFrag;
  15. FROM Intuition IMPORT WindowPtr;
  16. FROM Graphics IMPORT Text, Move, SetAPen;
  17. FROM SYSTEM IMPORT ADR;
  18. FROM Str IMPORT Length;
  19. FROM RandomNumber IMPORT RND;
  20. FROM RandomNoten IMPORT RNDNote;
  21. FROM BerechneSchnitt IMPORT BerechneSchnitt;
  22. FROM NoteConversions IMPORT NoteToString;
  23. FROM Bammel IMPORT ShowRNDBammelText;
  24. FROM FachLehrer IMPORT ShowLehrerText;
  25. FROM SaveLoad IMPORT SaveAktGame, LoadAGame;
  26. FROM Menus IMPORT RefreshSpielerMenu;
  27.  
  28.  
  29.  
  30.  
  31. PROCEDURE AlleHabenAbsolviert(): BOOLEAN;
  32. VAR AktS: SpielerPtr;
  33. BEGIN
  34.    AktS := AlleSpieler;
  35.    WHILE AktS # NIL DO
  36.       IF AktS^.Jahr < 5 THEN
  37.          RETURN FALSE
  38.       END;
  39.       AktS := AktS^.Next
  40.    END;
  41.    RETURN TRUE
  42. END AlleHabenAbsolviert;
  43.  
  44.  
  45.  
  46. PROCEDURE FindWorst(): SpielerPtr;
  47. (* Gibt nil zurück, wenn alle durchgefallen *)
  48. VAR Akt, Wor: SpielerPtr;
  49.     W : REAL;
  50. BEGIN
  51.    Akt := AlleSpieler;
  52.    W := 7.0;
  53.    WHILE Akt # NIL DO
  54.       IF (W > Akt^.Zeugnis.GesammtSchnitt) AND (Akt^.Jahr # 6) THEN
  55.          W := Akt^.Zeugnis.GesammtSchnitt;
  56.          Wor := Akt
  57.       END;
  58.       Akt := Akt^.Next
  59.    END;
  60.    IF W = 7.0 THEN
  61.      (* Alle Durchgefallen *)
  62.       RETURN NIL
  63.    ELSE
  64.       RETURN Wor
  65.    END
  66. END FindWorst;
  67.  
  68.  
  69.  
  70.  
  71.  
  72. PROCEDURE Bewertung;
  73. VAR SP: SpielerPtr;
  74.     str: ARRAY [0..36] OF CHAR;
  75. BEGIN
  76.    SP := FindWorst();
  77.    IF SP # NIL THEN
  78.       (* Es existiert ein schlechtester Abslovent *)
  79.  
  80.       AddAbiTxtLin("Sieger ist : ");
  81.       AddAbiTxtLin(SP^.Name);
  82.       AddAbiTxtLin("mit der Note:");
  83.       NoteToString(SP^.Zeugnis.GesammtSchnitt , TRUE, str);
  84.       AddAbiTxtLin(str)
  85.    ELSIF AnzahlSpieler > 0 THEN
  86.       AddAbiTxtLin("Alle sind durchgefallen");
  87.       AddAbiTxtLin("");
  88.       AddAbiTxtLin("Es gibt keinen Gewinner")
  89.    ELSE
  90.       AddAbiTxtLin(" Keine Spieler ")
  91.    END;
  92.    ShowAbiTxt(weisS)
  93. END Bewertung;
  94.  
  95.  
  96.  
  97.  
  98. PROCEDURE FindRNDSchuel(VAR S: SpielerPtr): BOOLEAN;
  99. (* Gibt nur FALSE zurück, wenn alle absolviert haben *)
  100. VAR IncCount: INTEGER;
  101. BEGIN
  102.    S := NIL;
  103.    IF AlleHabenAbsolviert() THEN RETURN FALSE END;
  104.    IncCount := RND(40);
  105.  
  106.    S := AlleSpieler;
  107.    WHILE S^.Jahr >= 5 DO
  108.       S := S^.Next
  109.    END;
  110.    WHILE IncCount > 0  DO
  111.       S := S^.Next;
  112.       IF S = NIL THEN S := AlleSpieler END;
  113.       WHILE S^.Jahr >= 5 DO
  114.          S := S^.Next;
  115.          IF S = NIL THEN S := AlleSpieler END
  116.       END;
  117.       DEC (IncCount)
  118.    END;
  119.    RETURN TRUE
  120. END FindRNDSchuel;
  121.  
  122.  
  123.  
  124. PROCEDURE Bilanz;
  125. VAR SPtr: SpielerPtr;
  126.     Fach: FaecherTypen;
  127. BEGIN
  128.    IF AlleHabenAbsolviert() THEN
  129.       Bewertung
  130.    ELSE
  131.       SPtr := AlleSpieler;
  132.       WHILE SPtr # NIL DO
  133.          IF SPtr^.Jahr < 5 THEN
  134.             INC(SPtr^.Jahr)
  135.          END;
  136.          BerechneSchnitt(SPtr); (* Neue Vornote und Schnitt *)
  137.          FOR Fach := Turnen TO Informatik DO
  138.             SPtr^.Zeugnis.AktuelleSumme[Fach] := 0.0;
  139.             SPtr^.Zeugnis.AnzInSumme[Fach] := 0
  140.          END;
  141.  
  142.          IF ODD(SPtr^.Provisorisch) THEN
  143.           (* Schüler(in) ist Provi *)
  144.             IF (SPtr^.Zeugnis.GesammtSchnitt < 3.75) OR
  145.                (SPtr^.Absenzen > 3) THEN
  146.                (* Repetieren *)
  147.                IF SPtr^.Jahr > 1 THEN DEC(SPtr^.Jahr) END
  148.             END;
  149.             INC(SPtr^.Provisorisch);
  150.             IF SPtr^.Provisorisch >= 6 THEN
  151.                SPtr^.Jahr := 6 (* Herausgefallen *)
  152.             END
  153.          ELSE (* Kein(e) Provi *)
  154.             IF (SPtr^.Zeugnis.GesammtSchnitt < 3.75) OR
  155.                (SPtr^.Absenzen > 3) THEN
  156.                (* Wird Provi *)
  157.                INC(SPtr^.Provisorisch)
  158.             END
  159.          END;
  160.  
  161.          SPtr^.Absenzen := 0;
  162.          FOR Fach := Turnen TO Informatik DO
  163.             SPtr^.Zeugnis.VorNote[Fach] := SPtr^.Zeugnis.Schnitt[Fach]
  164.          END;
  165.          SPtr := SPtr^.Next
  166.       END;
  167.       IF NOT AlleHabenAbsolviert() THEN
  168.          AddAbiTxtLin("Ein Neues Schuljahr bricht");
  169.          AddAbiTxtLin("an. Lernt eure Zeugnise");
  170.          AddAbiTxtLin("auswendig.");
  171.          ShowAbiTxt(weisS)
  172.       END
  173.    END
  174. END Bilanz;
  175.  
  176.  
  177.  
  178. PROCEDURE BammelPause(S: SpielerPtr);
  179. BEGIN
  180.       IF RND(3) = 1 THEN  (* Hier Absenz *)
  181.          AddAbiTxtLin("Warum hat wohl");
  182.          AddAbiTxtLin(S^.Name);
  183.          AddAbiTxtLin("letzthin wieder mal gefehlt?");
  184.          ShowAbiTxt(weisS);
  185.          INC(S^.Absenzen)
  186.       ELSIF (RND(5) = 1) AND (S^.ErfahrungsNoteGs <= 5.0) THEN
  187.         (* Hier Geschichte + 1 *)
  188.          AddAbiTxtLin("Hey !!!");
  189.          AddAbiTxtLin(S^.Name);
  190.          AddAbiTxtLin("der Geschichtslehrer hat");
  191.          AddAbiTxtLin("Dich im Schulorchester");
  192.          AddAbiTxtLin("erspäht. Deine Note in");
  193.          AddAbiTxtLin("Geschichte steigt diskret");
  194.          AddAbiTxtLin("um einen Punkt!");
  195.          ShowAbiTxt(blaU);
  196.          S^.ErfahrungsNoteGs := 1.0 + S^.ErfahrungsNoteGs;
  197.          S^.Zeugnis.VorNote[Geschichte] := 1.0 +
  198.                                S^.Zeugnis.VorNote[Geschichte]
  199.       ELSE (* Hier Bammel *)
  200.          ShowRNDBammelText
  201.       END
  202. END BammelPause;
  203.  
  204.  
  205.  
  206. PROCEDURE NormaleStunde(S:SpielerPtr);
  207. VAR Fach: FaecherTypen;
  208.     Fr:   FragePtr;
  209.     Str:  ARRAY[0..255] OF CHAR;
  210.     Ant:  SchuelerAntwort;
  211.     Note: REAL;
  212. BEGIN
  213.    Fach := GetFach(S^.Jahr);
  214.    Fr := SearchRNDFrage(Fach);
  215.    IF Fr # NIL THEN
  216.       BerechneSchnitt(S);
  217.       AddAbiTxtLin("Stunde: ");
  218.       AddAbiTxtLin(FaecherNamen[Fach].VollName);
  219.  
  220.       AddAbiTxtLin("Der Lehrer will es von:");
  221.       AddAbiTxtLin(S^.Name);
  222.       AddAbiTxtLin("wissen !");
  223.       AddAbiTxtLin(" ");
  224.       AddAbiTxtLin("NotenSchnitt:");
  225.       NoteToString(S^.Zeugnis.GesammtSchnitt, TRUE, Str);
  226.       AddAbiTxtLin(Str);
  227.       ShowAbiTxt(weisS);
  228.  
  229.       IntuFrag(Fr, Ant);
  230.  
  231.      (* Notengebung : *)
  232.       IF Fach = Geschichte THEN
  233.          Note := S^.ErfahrungsNoteGs
  234.       ELSIF Fach = Turnen THEN
  235.          Note := S^.SympathieNoteTurnen
  236.       ELSIF Fach = Geographie THEN
  237.          Note := RNDNote()
  238.       ELSE
  239.          Note := Bewerte(Fr, Ant)
  240.       END;
  241.  
  242.       AddAbiTxtLin("Note:");
  243.       NoteToString(Note, FALSE, Str);
  244.       AddAbiTxtLin(Str);
  245.       ShowAbiTxt(weisS);
  246.  
  247.       INC(S^.Zeugnis.AnzInSumme[Fach]);
  248.       S^.Zeugnis.AktuelleSumme[Fach] :=
  249.            S^.Zeugnis.AktuelleSumme[Fach] + Note;
  250.       IF Plaene[S^.Jahr].Bele[Zeit.Tag, Zeit.Stunde].MaturFach THEN
  251.          INC(S^.Zeugnis.AnzInSumme[Fach]);
  252.          S^.Zeugnis.AktuelleSumme[Fach] :=
  253.               S^.Zeugnis.AktuelleSumme[Fach] + Note
  254.       END
  255.    END
  256. END NormaleStunde;
  257.  
  258.  
  259.  
  260. VAR BillGezeigt: BOOLEAN;
  261.  
  262. PROCEDURE SchulFrage;
  263. VAR S: SpielerPtr;
  264. BEGIN (* SchulFrage *)
  265.    IF AlleHabenAbsolviert() THEN
  266.       Bewertung
  267.    ELSE
  268.       IF (Zeit.Tag = 0) AND (Zeit.Stunde = 8) AND (NOT BillGezeigt) THEN
  269.          Bilanz; BillGezeigt := TRUE
  270.       ELSIF FindRNDSchuel(S) THEN
  271.          IF RND(3) = 1 THEN
  272.             BammelPause(S); IncTime
  273.          ELSE
  274.             NormaleStunde(S);
  275.             IF AlleHabenAbsolviert() THEN
  276.                Bewertung
  277.             ELSE
  278.                IncTime
  279.             END
  280.          END;
  281.          BillGezeigt := FALSE
  282.  
  283.       END
  284.    END
  285. END SchulFrage;
  286.  
  287.  
  288.  
  289. VAR i, Param: INTEGER;
  290.     Aktio: SpielAktion;
  291.     Bool: BOOLEAN;
  292.  
  293. BEGIN (* Abitur *)
  294.       BillGezeigt := FALSE;
  295.       LOOP
  296.          GetAktion(Aktio, Param);
  297.          CASE Aktio OF
  298.             Ende         :  EXIT
  299.          |  Save         :  IF AnzahlSpieler > 0 THEN
  300.                                SaveAktGame
  301.                             END
  302.          |  Load         :  LoadAGame;
  303.                             Bool := RefreshSpielerMenu()
  304.          |  ZeigeStupl   :  ZeigePlan(Param)
  305.          |  CloseAPlan   :  ClosePlanFenster(Param)
  306.          |  NaechsteFrage:  IF AnzahlSpieler > 0 THEN
  307.                                SchulFrage
  308.                             END
  309.          |  ZeigFach     :  ShowLehrerText(FaecherTypen(Param))
  310.          |  ZeigZeugnis  :  ZeigSchuelerZeugnis(Param)
  311.          |  NeuesSpiel   :  FOR i := 1 TO 4 DO
  312.                                ClosePlanFenster(i)
  313.                             END;
  314.                             InitPlayers;
  315.                             Zeit.Tag := 0; Zeit.Stunde := 8
  316.          ELSE
  317.          END
  318.       END; (* Loop *)
  319.       FOR i := 1 TO 4 DO
  320.           ClosePlanFenster(i)
  321.       END
  322. END Abitur.
  323.  
  324.